% Ejercicio "Secuencias de ceros y unos"
\section*{\fbox{\theejercicio} - Secuencias de ceros y unos}

En un fichero de texto, se escriben cadenas de un lenguaje L definido sobre el alfabeto \{0,1\} del cual se sabe que est\'e compuesto por secuencias de unos y ceros en los que aparecen como m\'aximo tres unos seguidos. Se desconoce cuantos ceros puede haber intercalados entre los unos.

\par Por ejemplo, pueden ser cadanas de este lenguaje las siguientes:

00001100001110000011000010000 \\
10001 \\
100010001110011011

pero no es la siguiente:

00001110011000000111110000

puesto que tiene m\'as de tres unos seguidos.

\par Un fichero de texto puede contener varias cadenas de este lenguaje, separadas por blancos, comas... junto con cadenas que no pertenecen al lenguaje, por ejemplo, un fichero puede ser:

\begin{center}
\begin{tabular}{|l|}
\hline
00001100001110000011000010000\ \ \ \ \ \ 001000100011100010001000 \\
0000000\ \ \ \ 10001\ \ \ \ \ \ 1000100011110011011\ \ \ \ \ 00001110011000000111110000 \\ \hline
\end{tabular}
\end{center}

Se desea analizar este lenguaje desde un punto de vista probabil\'{\i}stico, analizando las subsecuencias de unos y ceros que aparecen en cada una de las cadenas del lenguaje. Dise\~nar mediante LEX un programa que halle los siguientes datos:

\begin{enumerate}[a)]
\item N\'umero medio de ceros antes de un \'unico uno.
\item N\'umero medio de ceros antes de dos unos
\item N\'umero medio de ceros antes de una cadena de tres unos.
\end{enumerate}

Para la resoluci\'on de este ejercicio solo pueden emplearse las variables declaradas en la siguiente secci\'on:

\begin{verbatim}
%{
   int p1=0;
   int p2=0;
   int p3=0;
   int t1=0; // total 1
   int t2=0; // total 2
   int t3=0; // total 3
%}
\end{verbatim}

El analizador debe contabilizar todas las subcadenas posibles para cada una de las cadenas, pero no debe en ning\'un caso tener en cuenta ninguna de las subcadenas de  las cadenas que no pertenezcan al lenguaje. Se asume que la entrada solo contiene ceros y unos y caracteres en blanco y de fin de l\'{\i}nea que separan las cadenas del lenguaje.

\par Ejemplo: Sea el fichero de entrada:

\fbox{010100110011 1000100110000001010111 000111000111110001}

\par Este fichero contiene dos cadenas que pertenecen al lenguaje, y una tercera que no pertenece. De las dos primeras cadenas tenemos se obtienen los siguientes valores: (solo se muestra el an\'alisis del primer apartado).

\fbox{$\underbrace{0}_{1}${\bf {\large 1}}$\underbrace{0}_{1}${\bf {\large 1}}00110011\ \ $\underbrace{}_{0}${\bf {\large 1}}$\underbrace{000}_{3}${\bf {\large 1}}0011$\underbrace{000000}_{6}${\bf {\large 1}}$\underbrace{0}_{1}${\bf {\large 1}}0111\ \ 000111000111110001}

\bigskip

$$ Media_1 = \frac{p_1 = 1+1+0+3+6+1}{t_1=6} = 2 $$

% Solución del ejercicio
\subsection*{SOLUCI\'ON}

\begin{verbatim}
%{
   int p1=0;
   int p2=0;
   int p3=0;
   int t1=0; // total 1
   int t2=0; // total 2
   int t3=0; // total 3
%}

%%

[01]*1111[01]*  { ; }
0*111           { t3++; p3 += yyleng-3; }
0*11            { t2++; p2 += yyleng-2; }
0*1             { t1++; p1 += yyleng-1; }                 
.|\n            { ; }

%%

int yywrap() {
   if (t1 != 0)  
      printf("N. medio de ceros antes de un unico uno: %.2f\n",
                  (float)p1 / (float)t1);
   }
   if (t2 != 0) { 
      printf("N. medio de ceros antes de dos unos: %.2f\n", 
                  (float)p2  / (float)t2);
   }
   if (t3 != 0) { 
      printf("N. medio de ceros antes de tres unos: %.2f\n", 
                  (float)p3 / (float)t3);
   }
   return 1;
}
\end{verbatim}